package com.lh.utils;

import com.lh.entity.table.RectificationInfo;
import com.lh.entity.vo.RectificationAnalyze;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class RectificationTypeConverter{

    /**
     * 核心方法：转换并按项目子分类分组统计
     * @param rectificationInfoList 原始 RectificationInfo 列表
     * @return 分组后的 RectificationAnalyze 列表
     */
    public static List<RectificationAnalyze> convertAndGroupByChildCategory(List<RectificationInfo> rectificationInfoList) {
        // 1. 过滤无效数据：排除项目子分类为空/空白的记录（可根据业务调整）
        List<RectificationInfo> validInfoList = rectificationInfoList.stream()
                .filter(info -> {
                    if (info.getProjectChildCategoryType()==null){
                        info.setProjectChildCategoryType(info.getProjectChildType());
                    }
                    String childCategory = info.getProjectChildCategoryType();
                    return childCategory != null && !childCategory.trim().isEmpty();
                })
                .collect(Collectors.toList());

        // 2. 按 projectChildCategoryType 分组（去空格避免重复分组）
        Map<String, List<RectificationInfo>> childCategoryGroupMap = validInfoList.stream()
                .collect(Collectors.groupingBy(
                        info -> info.getProjectChildCategoryType().trim(),
                        Collectors.toList()
                ));

        // 3. 遍历分组，计算统计数据并构建结果
        List<RectificationAnalyze> analyzeResultList = new ArrayList<>();
        for (Map.Entry<String, List<RectificationInfo>> groupEntry : childCategoryGroupMap.entrySet()) {
            // 当前分组的核心信息
            String projectChildCategory = groupEntry.getKey();
            List<RectificationInfo> groupData = groupEntry.getValue();

            // 3.1 统计红、黄、绿预警数量及总数
            int totalCount = groupData.size();
            int redCount = countWarnLevel(groupData, 2);   // 假设 2=红色预警
            int yellowCount = countWarnLevel(groupData, 1); // 假设 1=黄色预警
            int greenCount = countWarnLevel(groupData, 0);  // 假设 0=绿色预警

            // 3.2 计算绿色率、红色率（保留两位小数）
            String greenRate = calculateRate(greenCount, totalCount);
            String redRate = calculateRate(redCount, totalCount);

            // 3.3 构建 RectificationAnalyze 对象
            RectificationAnalyze analyze = new RectificationAnalyze();
            // 基础信息：取分组内第一条数据的项目类型（默认同子分类类型一致）
            RectificationInfo firstInfo = groupData.get(0);
            analyze.setName(projectChildCategory); // name 用项目子分类命名，直观区分
            analyze.setProjectType(firstInfo.getProjectType());
            analyze.setProjectChildType(firstInfo.getProjectChildType());
            analyze.setProjectChildCategoryType(projectChildCategory);
            // 统计数据
            analyze.setTotal(totalCount);
            analyze.setRed(redCount);
            analyze.setYellow(yellowCount);
            analyze.setGreen(greenCount);
            analyze.setGreenRate(greenRate);
            analyze.setRedRate(redRate);

            analyzeResultList.add(analyze);
        }

        // 4. 可选：按项目子分类名称升序排序（提升可读性）
        analyzeResultList.sort(Comparator.comparing(RectificationAnalyze::getProjectChildCategoryType));

        return analyzeResultList;
    }

    /**
     * 工具方法：统计指定预警级别的数量
     * @param infoList 分组数据列表
     * @param targetLevel 目标预警级别（0=绿，1=黄，2=红）
     * @return 目标级别的数量
     */
    private static int countWarnLevel(List<RectificationInfo> infoList, int targetLevel) {
        return (int) infoList.stream()
                .filter(info -> info.getWarnLevel() != null) // 排除预警级别为null的记录
                .filter(info -> info.getWarnLevel().equals(targetLevel))
                .count();
    }

    /**
     * 工具方法：计算比率（分子/分母 * 100%），处理除零异常
     * @param numerator 分子（如红色预警数）
     * @param denominator 分母（如总数）
     * @return 格式化比率（例："50.00%"）
     */
    private static String calculateRate(int numerator, int denominator) {
        if (denominator == 0) {
            return "0.00%"; // 分母为0时返回默认值，避免算术异常
        }
        // 精确计算：保留4位小数 → 乘100 → 保留2位小数
        BigDecimal rateBig = new BigDecimal(numerator)
                .divide(new BigDecimal(denominator), 4, RoundingMode.HALF_UP)
                .multiply(new BigDecimal(100))
                .setScale(2, RoundingMode.HALF_UP);
        return rateBig + "%";
    }


}
